package com.rzcode.coinex.kernel.dao.entity;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.rzcode.coinex.kernel.common.enums.BooleanEnum;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.math.BigDecimal;

/**
 * 会员钱包实体类，用于存储会员在平台上的各种币种的余额信息。
 */
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@TableName(value = "member_wallet")
public class MemberWallet {

    /**
     * 钱包ID，主键，自动生成的唯一标识。
     */
    @ApiModelProperty(value = "钱包ID", example = "1")
    private Long id;

    /**
     * 会员ID，与该钱包关联的会员信息。
     */
    @ApiModelProperty(value = "会员ID", example = "1001")
    private Long memberId;

    /**
     * 币种，与该钱包关联的币种信息。
     */
    @ApiModelProperty(value = "币种", hidden = true)
    private Coin coin;

    /**
     * 可用余额，会员可以自由支配的币种余额。
     */
    @ApiModelProperty(value = "可用余额", example = "100.000000000000000000")
    private BigDecimal balance;

    /**
     * 冻结余额，暂时不可用的币种余额，如用于挂单交易。
     */
    @ApiModelProperty(value = "冻结余额", example = "10.000000000000000000")
    private BigDecimal frozenBalance;

    /**
     * 待释放总量，尚未解锁的币种余额，如奖励、空投等。
     */
    @ApiModelProperty(value = "待释放总量", example = "50.00000000")
    private BigDecimal toReleased = BigDecimal.ZERO;

    /**
     * 充值地址，用于接收充值的地址信息。
     */
    @ApiModelProperty(value = "充值地址", example = "1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa")
    private String address;

    /**
     * 版本号，用于乐观锁控制。
     */
    @ApiModelProperty(value = "版本号", hidden = true)
    private int version;

    /**
     * 钱包是否锁定，0表示未锁定，1表示已锁定。
     */
    @ApiModelProperty(value = "钱包是否锁定", example = "0")
    private BooleanEnum isLock = BooleanEnum.IS_FALSE;

    /**
     * Memo，某些币种（如EOS、XRP）在转账时需要附带的备注信息。
     */
    @ApiModelProperty(value = "Memo", example = "12345678")
    private String memo;
}
